use proc_macro::TokenStream;
use quote::quote;
use syn::{Attribute, Block, ItemFn, Stmt, parse_macro_input, parse_quote};

//--- 使用时, 需要结合 crate:function_name 中的 #[named] 属性
//---  需要自己定义 function_path!() 宏, 该宏会打印当前函数的路径
#[proc_macro_attribute]
pub fn mydbginfo(_attr: TokenStream, item: TokenStream) -> TokenStream {
    let mut input_fn = parse_macro_input!(item as ItemFn);

    // 1. 添加 #[named] 属性
    let named_attr: Attribute = parse_quote! { #[named] };
    input_fn.attrs.insert(0, named_attr);

    // 2. 在函数体开头插入 function_path!()
    let mut stmts = input_fn.block.stmts;
    let new_stmt: Stmt = parse_quote! { function_path!(); };
    stmts.insert(0, new_stmt);

    // 3. 创建新的函数体
    input_fn.block = Box::new(Block {
        brace_token: input_fn.block.brace_token,
        stmts,
    });

    // 4. 生成输出 TokenStream
    TokenStream::from(quote! { #input_fn })
}
